//
// Created by zuo on 2024/6/30.
//

#include<iostream>
#include<cstring>   //memset
#include<algorithm>
#include <bitset>
#include<vector>

using namespace std;

/*
memset(ptr,value,num)函数接受三个参数
1.ptr:指向要设置值的内存块的指针。
2.value:要设置的值，通常是一个整数。
3.num:要设置的字节数。  int 32bit 4Bytes   sizeof a = 40
*/

/*
swap(T &a,T &b)函数接受两个参数
1.a:要交换值的第一个变量的引用
2.b:要交换值的第二个变量的引用
*/

/*
reverse()函数接受两个参数:
1.first:指向容器中要反转的第一个元素的迭代器
2.last:指向容器中要反转的最后一个元素的 下一个位置 的迭代器
reverse()函数将[first,last)范围内的元素顺序进行反转。
 */

/*
unique(first, last)函数接受两个参数:
1.first:指向容器中要去重的第一个元素的迭代器。
2.last:指向容器中要去重的最后一个元素的 下一个位置 的迭代器
unique()函数将[first, 1ast)范围内的  相邻  重复元素  去除，并返回一个指向去重后迭代器后面的位置
例：  5 5 5 3 2 2 3 3 4 4 4 2 1 1 -> 5 3 2 3 4 2 1   3 4 4 4 2 1 1  指向 1 后面的 3
一般 unique 之前都用 sort 排一下顺序 保证重复元素都 相邻
 */


int main()
{
    // int a[10];
    // for (auto i : a) cout << i << " \n"[i == a[9]]; // 乱七八糟
    // memset(a, 0, sizeof a); // 只有 0 和 -1 可以直接设置
    // for (auto i : a) cout << i << ' '; // 全0
    // cout << endl;
    // memset(a, 1, sizeof a); // 设置成1  则每8个有一个1 00000001 00000001 00000001 00000001
    // for (auto i : a) cout << bitset<32>(i) << ' '; // 00000001 00000001 00000001 00000001

    // int b = 10;
    // int c = 20;
    // swap(b, c);
    // cout << "b = " << b << '\n' << "c = " << c << '\n';

    vector<int> v = {1, 1, 2, 4, 4, 4, 3, 3, 2, 2, 3, 5, 5, 5};
    reverse(v.begin(), v.end());
    for (auto i : v) cout << i << ' '; // 5 5 5 3 2 2 3 3 4 4 4 2 1 1
    cout << '\n';
    auto it = unique(v.begin(), v.end());
    for (auto i : v) cout << i << ' '; // 5 3 2 3 4 2 1 3 4 4 4 2 1 1
    cout << "\n";
    // 删除多余的重复元素  [ )
    v.erase(it, v.end());
    for (auto i : v) cout << i << ' '; // 5 3 2 3 4 2 1
    cout << "\n";

    return 0;
}
